#include "Zigbee.h"

void Zigbee_Init(void)
{
    NVIC_ClearPendingIRQ(UART3_INST_INT_IRQN);
    //使能串口中断
    NVIC_EnableIRQ(UART3_INST_INT_IRQN);
}

uint8_t Usart3_Data[Usart_Len];

//串口的中断服务函数
void UART3_IRQHandler(void)
{
    //如果产生了串口中断  //如果是接收中断
    if( DL_UART_getPendingInterrupt(UART3) == DL_UART_IIDX_RX )
    {
        uint8_t data;                 // 临时存储接收到的数据
        //将发送过来的数据保存在变量中
        data = DL_UART_Main_receiveData(UART3);
    }
}

void Jiex(uint8_t data)
{
    static uint8_t len = 0;       // 数据长度计数器
    static uint8_t RX_Flag = 0;   // 接收状态标志
    switch (RX_Flag) {
            case 0: //* 等待第一个帧头
                if (data == 0x05) {
                    RX_Flag = 1; // 进入接收第二个帧头状态
                    len = 0;     // 重置数据长度计数器
                }
                break;

            case 1: //? 等待第二个帧头
                if (data == 0x4F) {
                    RX_Flag = 2; // 进入接收数据状态
                }
                break;

            case 2: //! 接收数据
                Usart3_Data[len++] = data; // 存储数据并递增计数器
                if (data == 0x5B) {       // 检查是否接收到结束符
                    //! 解析数据
                    ZB_Rx.c1 = Usart3_Data[0];
                    ZB_Rx.c2 = Usart3_Data[1];
                    ZB_Rx.c3 = Usart3_Data[2];
                    ZB_Rx.c4 = Usart3_Data[3];
                    ZB_Rx.c5 = Usart3_Data[4];
                    RX_Flag = 3; //* 进入接收完成状态
                }
                break;

            case 3: //? 接收完成
                if (Usart3_Data[len - 1] == 0x5B) {
                    RX_Flag = 0; //* 重置状态，等待下一帧数据
                }
                break;

            default:
                RX_Flag = 0; //! 非法状态，重置
                break;
        }

}


void Bytes_Data(uint8_t Data1, uint8_t Data2, uint8_t Data3, uint8_t Data4, uint8_t Data5)
{
    // 协议帧定义（const优化）
    static const uint8_t frame_header[] = {0x05, 0x4F};
    static const uint8_t frame_footer = 0x5B;

    // 发送帧头（使用循环优化）
    for(uint8_t i = 0; i < sizeof(frame_header); i++) {
    DL_UART_Main_transmitData(UART3_INST, frame_header[i] );
    while( DL_UART_isBusy(UART3_INST) == true ); // 使用标准标志位定义
    }

    // 发送数据（数组化处理）
    uint8_t data[] = {Data1, Data2, Data3, Data4, Data5};
    for(uint8_t i = 0; i < sizeof(data); i++) {
    DL_UART_Main_transmitData(UART3_INST, data[i] );
    while( DL_UART_isBusy(UART3_INST) == true );
}
    // 发送帧尾
    DL_UART_Main_transmitData(UART3_INST, frame_footer );
    while( DL_UART_isBusy(UART3_INST) == true );
}